////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef _CMAYACAMERAANIMATOR_H_
#define _CMAYACAMERAANIMATOR_H_

////////////////////////////////////////////////////////////////////////////////////////////////////

#include "CGlobals.h"
#include "position2d.h"
#include "ISceneNodeAnimator.h"

namespace irr
{
	namespace gui
	{
		class ICursorControl;
	}
}
////////////////////////////////////////////////////////////////////////////////////////////////////

class CSceneNodeAnimatorCameraMaya : public ISceneNodeAnimator 
{
public:
	//! Constructor
	CSceneNodeAnimatorCameraMaya(ICursorControl* cursor, f32 rotateSpeed = -1500.0f, 
		f32 zoomSpeed = 200.0f, f32 translationSpeed = 1500.0f);

	//! Destructor
	virtual ~CSceneNodeAnimatorCameraMaya();

	virtual ISceneNodeAnimator* createClone(ISceneNode* node,
				ISceneManager* newManager=0);

	//! Animates the scene node, currently only works on cameras
	virtual void animateNode(ISceneNode* node, u32 timeMs);

	//! Event receiver
	virtual bool OnEvent(const SEvent& event);

	//! Returns the speed of movement in units per millisecond
	virtual f32 getMoveSpeed() const;

	//! Sets the speed of movement in units per millisecond
	virtual void setMoveSpeed(f32 moveSpeed);

	//! Returns the rotation speed
	virtual f32 getRotateSpeed() const;

	//! Set the rotation speed
	virtual void setRotateSpeed(f32 rotateSpeed);

	//! Returns the zoom speed
	virtual f32 getZoomSpeed() const;

	//! Set the zoom speed
	virtual void setZoomSpeed(f32 zoomSpeed);

	//! This animator will receive events when attached to the active camera
	virtual bool isEventReceiverEnabled() const
	{
		return true;
	}

	//! Returns type of the scene node
	virtual ESCENE_NODE_ANIMATOR_TYPE getType() const 
	{
		return ESNAT_CAMERA_MAYA;
	}

	//! Creates a clone of this animator.
	/** Please note that you will have to drop
	(IReferenceCounted::drop()) the returned pointer after calling
	this. */	

private:

	void allKeysUp();
	void animate();
	bool isMouseKeyDown(s32 key);
	void updateAnimationState();

	bool MouseKeys[3];

	gui::ICursorControl *CursorControl;
	core::vector3df Pos;
	bool Zooming;
	bool Rotating;
	bool Moving;
	bool Translating;
	f32 ZoomSpeed;
	f32 RotateSpeed;
	f32 TranslateSpeed;
	f32 RotateStartX, RotateStartY;
	f32 ZoomStartX, ZoomStartY;
	f32 TranslateStartX, TranslateStartY;
	f32 CurrentZoom;
	f32 RotX, RotY;
	core::vector3df Target;
	core::vector3df OldTarget;
	scene::ICameraSceneNode* OldCamera;

	core::position2d<f32> MousePos;
	core::position2d<f32> StartMousePos;

	bool m_bWheel;
	int m_wheel;
};

////////////////////////////////////////////////////////////////////////////////////////////////////

#endif
